/* =============================================================================
 * PROJET           	: Matrices creuses
 * NOM DU FICHIER   	: Matrices_creuses.c
 * OBJET            	: Paquetage exportant le type t_Matrice et les fonctions 
 *							: necessaires à son utilisation
 * -----------------------------------------------------------------------------
 * DATE DE CREATION 	: 03/04/2009
 * AUTEUR           	: Ivan VALIMAHAMED, Sha LIU, Yves BOGE
 * -----------------------------------------------------------------------------
 * MODIFICATIONS (   n) date - auteur - description )
 * ============================================================================= */

#include "Matrices_creuses.h"


/* 
 *	NOM 				: Ajout_Element
 *	ENTREES 			: i_E : element a inserer dans la matrice
 *						: io_Mat : matrice dans laquelle on souhaite inserer l'element
 *	SORTIES			: pointeur sur l'element ajoute
 *	BUT				: ajout d'un element dans la matrice
 */
 
void Ajout_element(t_Elem* i_E , t_Matrice* io_Mat)
{
	/* Ajout dans la clause : */
	
	/* On regarde si la clause dans laquelle on doit inserer l'element est vide */
	if ( io_Mat->Clause[i_E->X.Num_clause - 1].Premier == NULL )
		io_Mat->Clause[i_E->X.Num_clause - 1].Premier = i_E;
	else
	/* il faut ajouter l'element apres le dernier ajouter (nous traitons les clauses dans l'ordre) */
		io_Mat->Dernier_elem->Var_suiv = (struct t_Elem*) i_E;
	
	/* Chainage selon la variable (l'ordre n'etant pas important, nous insererons en tete) : */
	i_E->Clause_suiv =  (struct t_Elem*) io_Mat->Var[i_E->X.Num_var - 1].Premier;
	io_Mat->Var[i_E->X.Num_var - 1].Premier = i_E;
	
	io_Mat->Dernier_elem = i_E;
}


/* 
 *	NOM 				: Affiche_matrice
 *	ENTREES 			: io_Mat : matrice a afficher
 *	SORTIES			: affichage de la matrice
 *	BUT				: afficher l'etat actuel de la matrice
 */
 
void Aff_matrice(t_Matrice* io_Mat)
{
	int Niv_prec, i, j;
	t_Elem* Courant;		/* pointeur sur l'element courant */
	char Signe;
	
	/* Affichage des informations generales sur la matrice */
	printf("\nNombre de clauses : %d\n", io_Mat->Nb_clauses);
	printf("Nombre de variables : %d\n\n", io_Mat->Nb_var);
	
	/* Affichage des variables de la matrice */
	for ( i = 0 ; i < io_Mat->Nb_var ; i++ )
		printf("\tX%d,%d", i + 1, io_Mat->Var[i].Valeur);
	
	/* Affichage des differentes clauses */
	for ( i = 0 ; i < io_Mat->Nb_clauses ; i++ )
	{
		printf("\nC%d,%d", i + 1, io_Mat->Clause[i].Etat);
		Niv_prec = 0;
		/* parcours des variables pour la clause */
		for ( Courant = (t_Elem*) io_Mat->Clause[i].Premier ; Courant != NULL ; Courant = (t_Elem*) Courant->Var_suiv )
		{
			if ( Courant->X.Signe == true )
				Signe = '+';
			else
				Signe = '-';
			
			/* Decalage du bon nombre de colonnes */
			for ( j = 0 ; j < (Courant->X.Num_var - Niv_prec) ; j++ )
				printf("\t");
			Niv_prec = Courant->X.Num_var;
			
			printf("%d,%d,%c,%d", Courant->X.Num_clause, Courant->X.Num_var, Signe, Courant->X.Val);
		}
	}
	printf(" \n");
}


/* 
 *	NOM 				: Clause_suivante
 *	ENTREES 			: i_E : element dont on veut le successeur dans la liste des clauses
 *	SORTIES			: pointeur sur l'element suivant dans la liste des clauses
 *	BUT				: permettre le parcours vertical de la matrice
 */
 
t_Elem* Clause_suivante(t_Elem* i_E)
{
	return (t_Elem*) i_E->Clause_suiv;
}


/* 
 *	NOM 				: Var_suivante
 *	ENTREES 			: i_E : element dont on veut le successeur dans la liste des variables
 *	SORTIES			: pointeur sur l'element suivant dans la liste des variables
 *	BUT				: permettre le parcours horizontal de la matrice
 */
 
t_Elem* Var_suivante(t_Elem* i_E)
{
	return (t_Elem*) i_E->Var_suiv;
}
